package pl.prv.polanie.client.panels.tabpanel;

import java.util.ArrayList;
import java.util.List;

import pl.prv.polanie.client.Planner;

import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DecoratedTabPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MouseListenerAdapter;
import com.google.gwt.user.client.ui.SourcesTabEvents;
import com.google.gwt.user.client.ui.Widget;

/**
 * 
 * TabPanel poszerzony o funkcjonalnosci:
 * 
 *  - minimalizowanie i przywracanie kontrolek podczas zmiany wyswietlanej tabki,
 *  - otwieranie tylko jednej kontrolki o danej etykiecie
 *  	Przy otwieraniu nowej tabki podajemy unikalny identyfikator. Jesli przy probie otworzenia innej <br>
 *   	tabki podamy ten sam identyfikator, to nowa tabka nie zostanie otwarta, a jedynie wyswietlona zostanie <br>
 *   	juz istniejaca tabka o identycznym identyfikatorze. <br>
 *   	Jedynie identyfikator w postaci ciagu o zerowej dlugosci moze wystepowac kilka razy.
 *   
 * 
 * @author Janusz Prokulewicz
 * Created: Oct 29, 2008
 * 
 */
public class MinimizableTabPanel extends DecoratedTabPanel {
	
	private static final String closeTabButtonImageURL = "images/customTabPanel_close.png";
	private static final String closeTabGrayButtonImageURL = "images/customTabPanel_closeGray.png";
	
	
	List<String> tabIdentifiers = new ArrayList<String>();
	List<Image> closeTabImages = new ArrayList<Image>();
	
	
	/**
	 * dodawanie moja metoda -> +id
	 * dodawanie 
	 */
	
	
//	@Override
//	public void add(Widget w, String tabText, boolean asHTML) {
//		Planner.log("MinimizableTabPanel.add: " + "DWON WITHOUT 1");
//		super.add(w, tabText, asHTML);
//		tabIdentifiers.add("");
//	}

	@Override
	public void add(Widget w, String tabText) {
		Planner.log("MinimizableTabPanel.add: " + "DODAJE ZAKLADKE O ID: [PUSTY]");
		super.add(w, tabText);
		tabIdentifiers.add("");
		closeTabImages.add(null);
		
		this.selectTab(getTabBar().getTabCount()-1);
	}
	
	/**
	 * Metoda sluzaca do dodawania nowych tabek o podanych identyfikatorach. <br>
	 * Jesli podany identyfikator juz jest obecny posrod otwartych zakladek, <br>
	 * wyswietlana jest zakladaka o takim wlasnie identyfikatorze.
	 *  
	 * @param w
	 * @param tabText
	 * @param identifier
	 */
	public boolean add(final Widget w, String tabText, String identifier) {
		boolean addedNewTab = false;
		
		Planner.log("MinimizableTabPanel.add: " + "DODAJE ZAKLADKE O ID: " + identifier);
		if (identifier.equals("")) {
			this.add(w, tabText);
			addedNewTab = true;
//			this.selectTab(getTabBar().getTabCount()-1);
		} else {
			Planner.log("MinimizableTabPanel.add: " + "JEEEE 1");
			//mamy identyfikator
			boolean doubleIdentifier = false;
			
			for (int i = 0; i < tabIdentifiers.size(); i++) {
				Planner.log("MinimizableTabPanel.add: " + "JEEEE 2___" + i + "___" + tabIdentifiers.get(i));
				if (tabIdentifiers.get(i).equals(identifier)) {
					//otwieramy dodana juz zakladke o takim samym identyfikatorze
					Planner.log("MinimizableTabPanel.add: " + "w tabPanelu istnieje juz zakladka o podanym id = wyswietlamy ja. Index => " + i);
					doubleIdentifier = true;
					
					selectTab(i);
					break;
				}
			}
			
			if (!doubleIdentifier) {
				
				final HorizontalPanel hp = new HorizontalPanel();
				HTML tabTextL = new HTML(tabText);
				tabTextL.setWordWrap(false);
				hp.add(tabTextL);
				

				
				final Image closeImage = new Image(closeTabButtonImageURL);
				closeImage.addMouseListener(new MouseListenerAdapter() {
					@Override
					public void onMouseEnter(Widget sender) {
						super.onMouseEnter(sender);
						closeImage.setUrl(closeTabButtonImageURL);
					}
					@Override
					public void onMouseLeave(Widget sender) {
						super.onMouseLeave(sender);
						
						int tabIndex = getDeckPanel().getWidgetIndex(w);
						if (getTabBar().getSelectedTab() != tabIndex) {
							closeImage.setUrl(closeTabGrayButtonImageURL);
						}
					}
				});
				hp.add(closeImage);
				closeTabImages.add(closeImage);
				closeImage.addClickListener(new ClickListener(){
					public void onClick(Widget sender) {
						int clickedTab = getDeckPanel().getWidgetIndex(w);
//						Window.alert("Closing Tab " + clickedTab);
						boolean wasSelected = getTabBar().getSelectedTab() == clickedTab;
						
						if (MinimizableTabPanel.this.remove(clickedTab)) {
							
							if (wasSelected) {
								
								//wybranie innej zakladki
								if (clickedTab < MinimizableTabPanel.this.getWidgetCount()) {
									MinimizableTabPanel.this.selectTab(clickedTab);
								} else if (clickedTab - 1 >= 0) {
									MinimizableTabPanel.this.selectTab(clickedTab - 1);
								}
							}
							
							
							
						}
						

					}
				});
//				caption.setStyleName("imag");
				closeImage.setStyleName("closeImage");
				
				
//				Label closeL = new Label("x");
//				closeL.addClickListener(new ClickListener() {
//					public void onClick(Widget sender) {
//						int clickedTab = getDeckPanel().getWidgetIndex(w);
//						Window.alert("Closing Tab " + clickedTab);
//					}
//				});
//				hp.add(closeL);
				
				
				
//				super.add(w, tabText);
				super.add(w, hp);
				addedNewTab = true;
				tabIdentifiers.add(identifier);		

				this.selectTab(getTabBar().getTabCount()-1);
			}
		}

		
		return addedNewTab;
	}

	
//	@Override
//	public void add(Widget w) {
//		Planner.log("MinimizableTabPanel.add: " + "DWON WITHOUT 4");
//		super.add(w);
//		tabIdentifiers.add("");
//	}
//
//	@Override
//	public void add(Widget w, Widget tabWidget) {
//		Planner.log("MinimizableTabPanel.add: " + "DWON WITHOUT 5");
//		super.add(w, tabWidget);
//		tabIdentifiers.add("");
//	}
//
//	public void removeTabByIdentifier() {
//		for (int i = 0; i < tabIdentifiers.size(); i++) {
//			String identifier = tabIdentifiers.
//			
//		}
//	}
	
	@Override
	public void clear() {
		super.clear();
		tabIdentifiers.clear();
		closeTabImages.clear();
	}
//
//	@Override
//	public void insert(Widget widget, String tabText, boolean asHTML,
//			int beforeIndex) {
//		Planner.log("MinimizableTabPanel.add: " + "DWON WITHOUT 7");
//		super.insert(widget, tabText, asHTML, beforeIndex);
//		tabIdentifiers.add(beforeIndex, "");
//	}
//
//	@Override
//	public void insert(Widget widget, String tabText, int beforeIndex) {
//		Planner.log("MinimizableTabPanel.add: " + "DWON WITHOUT 8");
//		super.insert(widget, tabText, beforeIndex);
//		tabIdentifiers.add(beforeIndex, "");
//	}
//
//	@Override
//	public void insert(Widget widget, Widget tabWidget, int beforeIndex) {
//		Planner.log("MinimizableTabPanel.add: " + "DWON WITHOUT 9");
//		super.insert(widget, tabWidget, beforeIndex);
//		tabIdentifiers.add(beforeIndex, "");
//	}
//
	
	private void minimizeWidgetInTab(int index) {
		if (index >= 0 && index < getWidgetCount()) {
			Widget w = getDeckPanel().getWidget(index);
			
			if (w instanceof IMinimizableTabContent) {
				IMinimizableTabContent tabContent = (IMinimizableTabContent) w;
				tabContent.onMinimize();
			}
			
		}
	}
	
	
	@Override
	public boolean remove(int index) {
		minimizeWidgetInTab(index);
		
		Planner.log("MinimizableTabPanel.remove: " + index);
		tabIdentifiers.remove(index);
		closeTabImages.remove(index);
		
		return super.remove(index);
	}
//
//	@Override
//	public boolean remove(Widget widget) {
//		int index = getWidgetIndex(widget);
//		boolean removed = super.remove(widget);
//		if (removed) {
//			tabIdentifiers.remove(index);
//		}
//		return removed; 
//	}
//
//	@Override
//	public void selectTab(int index) {
//		super.selectTab(index);
//	} 


	
	public Widget getSelectedWidget() {
		return getWidget(getDeckPanel().getVisibleWidget());
	}



	@Override
	public boolean onBeforeTabSelected(SourcesTabEvents sender, int tabIndex) {

		//przed zminimalizowaniem wywoluje metode onMinimize()
		int prevSelectedTabIndex = getDeckPanel().getVisibleWidget();
		Planner.log("MinimizableTabPanel.onBeforeTabSelected: POPRZENDI " + prevSelectedTabIndex);
		
		if (prevSelectedTabIndex >=0 ) {
			Widget w = getDeckPanel().getWidget(prevSelectedTabIndex);
			
			if (w instanceof IMinimizableTabContent) {
				IMinimizableTabContent tabContent = (IMinimizableTabContent) w;
				tabContent.onMinimize();
			}
			
			//wyszarzenie poprzednio zaznaczonej zakladki
			Image img = closeTabImages.get(prevSelectedTabIndex);
			if (img != null) {
				img.setUrl(closeTabGrayButtonImageURL);
 			}
		}
		
		return super.onBeforeTabSelected(sender, tabIndex);
	}
	
	
	@Override
	public void onTabSelected(SourcesTabEvents sender, int tabIndex) {
		super.onTabSelected(sender, tabIndex);
		
		//po wybraniu zakladki wywoluje metode onRestore()
		Widget w = getDeckPanel().getWidget(tabIndex);
		
		if (w instanceof IMinimizableTabContent) {
			IMinimizableTabContent tabContent = (IMinimizableTabContent) w;
			tabContent.onRestore();
		}
		
		//wyszarzenie poprzednio zaznaczonej zakladki
		
		Image img = closeTabImages.get(tabIndex);
		if (img != null) {
			Planner.log("MinimizableTabPanel.onTabSelected: PODCZAS ZAZNACZNIA " + tabIndex + ", img != NULL");
			img.setUrl(closeTabButtonImageURL);
		} else {
			Planner.log("MinimizableTabPanel.onTabSelected: PODCZAS ZAZNACZNIA " + tabIndex + ", img == NULL");
		}

	}

}
